////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
#include "Exceptions.hpp"

#include <sstream>

namespace smeg
{
	namespace tools
	{

////////////////////////////////////////////////////////////
/// Constructor
////////////////////////////////////////////////////////////
Exception::Exception( const std::string& _Message ) :
	m_Message( _Message )
{
}
    
////////////////////////////////////////////////////////////
/// Destructor
////////////////////////////////////////////////////////////
Exception::~Exception() throw()
{
}

////////////////////////////////////////////////////////////
/// Send back the message associated to the exception
////////////////////////////////////////////////////////////
const char* Exception::what() const throw() {
    return m_Message.c_str();
}

////////////////////////////////////////////////////////////
/// AssertException Constructor
////////////////////////////////////////////////////////////
AssertException::AssertException( const std::string& _File, int _iLine, const std::string& _Message ) {
    // Format of the error message
    std::ostringstream oss;
    oss << _Message << std::endl << std::endl;
    oss << _File << " (" << _iLine << ")";

    m_Message = oss.str();
}

////////////////////////////////////////////////////////////
/// BadDelete Constructor
////////////////////////////////////////////////////////////
BadDelete::BadDelete( const void* _pPtr, const std::string& _File, int _iLine, bool _bNewArray ) {
    // Formatage du message d'erreur
    std::ostringstream oss;
    oss << "Anomaly "
        << (_bNewArray ? "new[] / delete" :  "new / delete[]")
        << " detected" << std::endl << std::endl
        << "Address : 0x" << _pPtr << std::endl
        << "Source _File : " << _File << " (" << _iLine << ")";

    m_Message = oss.str();
}

////////////////////////////////////////////////////////////
/// LoadingFailed Constructor
////////////////////////////////////////////////////////////
LoadingFailed::LoadingFailed( const std::string& _File, const std::string& _Message ) {
    // Formatage du message d'erreur
    std::ostringstream oss;
    oss << "Error while loading of " << _File << std::endl << std::endl << _Message;

    m_Message = oss.str();
}


////////////////////////////////////////////////////////////
/// OutOfMemory Constructor
////////////////////////////////////////////////////////////
OutOfMemory::OutOfMemory( const std::string& _Message ) :
	Exception( _Message )
{
}

    } // namespace tools
} // namespace smeg
